package cycle.retrieve;

import cycle.RentDescription;
import jcolibri.cbrcore.Attribute;
import jcolibri.method.retrieve.NNretrieval.NNConfig;
import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction;
import jcolibri.method.retrieve.NNretrieval.similarity.global.Average;
import jcolibri.method.retrieve.NNretrieval.similarity.local.Equal;

public class SimilarityConfig {
	
	NNConfig config;
	LocalSimilarityFunction function;
	Attribute attribute;
	int k;
	
	public SimilarityConfig() {
		this.config = new NNConfig();
		configure();
	}
	
	public SimilarityConfig(double peso_bairro,double peso_regiao,double peso_areaPrivativa, double peso_vagasGaragem,
			double peso_quartos, double peso_suites) {
		
		this.config = new NNConfig();
		configure(peso_bairro,peso_regiao,peso_areaPrivativa,peso_vagasGaragem,peso_quartos,peso_suites);
	}
	
	private void configure() {
		setAttributeConfig("bairro", new Double(1));
		setAttributeConfig("regiao", new Double(1));
		setAttributeConfig("areaPrivativa", new Double(1));
		setAttributeConfig("vagasGaragem", new Double(1));
		setAttributeConfig("quartos", new Double(1));
		setAttributeConfig("suites", new Double(1));
		
		config.setDescriptionSimFunction(new Average());
		
		this.k = 3;
	}
	
	private void configure(double peso_bairro,double peso_regiao,double peso_areaPrivativa, double peso_vagasGaragem,
			double peso_quartos, double peso_suites) {
		setAttributeConfig("bairro", peso_bairro);
		setAttributeConfig("regiao", peso_regiao);
		setAttributeConfig("areaPrivativa", peso_areaPrivativa);
		setAttributeConfig("vagasGaragem", peso_vagasGaragem);
		setAttributeConfig("quartos", peso_quartos);
		setAttributeConfig("suites", peso_suites);
		
		config.setDescriptionSimFunction(new Average());
		
		this.k = 3;
	}
	
	private void setAttributeConfig(String name,Double weight) {
		attribute = new Attribute(name,RentDescription.class);
		function = new Equal();
		config.addMapping(attribute, function);
		config.setWeight(attribute, weight);
	}
	
	public int getK() {
		return this.k;
	}
	
	public void setK(int _k) {
		this.k = _k;
	}
	
	public NNConfig getSimilarityConfig() {
		return this.config;
	}
}